var regExpPattern = {
	    checkIsBlank  : /^(([\s]+)|([\s]*))$/, 
	    checkNumber   : /^([-]?[\d]+)+([.]{1,1}[\d]+)?$/, 
	    checkInteger  : /^([-]?[\d]+)?$/,
	    checkNInteger : /^([\d]+)?$/,  
	    checkFloat    : /^[-]?[\d]+[.]{1,1}[\d]+$/, 
	    checkNFloat   : /^[\d]+[.]{1,1}[\d]+$/, 
	    checkEnglish  : /^[a-zA-Z]*$/, 
	    checkEngAndNum: /^[0-9a-zA-Z]*$/, 
	    checkWordChar : /^[0-9_a-zA-Z]*$/
	  };

var regexEnum = 
{
	intege:"^-?[1-9]\\d*$",					//整数
	intege1:"^[1-9]\\d*$",					//正整数
	intege2:"^-[1-9]\\d*$",					//负整数
	num:"^([+-]?)\\d*\\.?\\d+$",			//数字
	num1:"^[1-9]\\d*|0$",					//正数（正整数 + 0）
	num2:"^-[1-9]\\d*|0$",					//负数（负整数 + 0）
	decmal:"^([+-]?)\\d*\\.\\d+$",			//浮点数
	decmal1:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*$",	//正浮点数
	decmal2:"^-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*)$", //负浮点数
	decmal3:"^-?([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0)$", //浮点数
	decmal4:"^[1-9]\\d*.\\d*|0.\\d*[1-9]\\d*|0?.0+|0$", //非负浮点数（正浮点数 + 0）
	decmal5:"^(-([1-9]\\d*.\\d*|0.\\d*[1-9]\\d*))|0?.0+|0$",//非正浮点数（负浮点数 + 0）

	email:"^\\w+((-\\w+)|(\\.\\w+))*\\@[A-Za-z0-9]+((\\.|-)[A-Za-z0-9]+)*\\.[A-Za-z0-9]+$", //邮件
	color:"^[a-fA-F0-9]{6}$",				//颜色
	url:"^http[s]?:\\/\\/([\\w-]+\\.)+[\\w-]+([\\w-./?%&=]*)?$",	//url
	chinese:"^[\\u4E00-\\u9FA5\\uF900-\\uFA2D]+$",					//仅中文
	ascii:"^[\\x00-\\xFF]+$",				//仅ACSII字符
	zipcode:"^\\d{6}$",						//邮编
	mobile:"^(13|15)[0-9]{9}$",				//手机
	ip4:"^(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)$",	//ip地址
	notempty:"^\\S+$",						//非空
	picture:"(.*)\\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$",	//图片
	rar:"(.*)\\.(rar|zip|7zip|tgz)$",								//压缩文件
	date:"^\\d{4}(\\-|\\/|\.)\\d{1,2}\\1\\d{1,2}$",					//日期
	qq:"^[1-9]*[1-9][0-9]*$",				//QQ号码
	tel:"^(([0\\+]\\d{2,3}-)?(0\\d{2,3})-)?(\\d{7,8})(-(\\d{3,}))?$",	//电话号码的函数(包括验证国内区号,国际区号,分机号)
	username:"^\\w+$",						//用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
	letter:"^[A-Za-z]+$",					//字母
	letter_u:"^[A-Z]+$",					//大写字母
	letter_l:"^[a-z]+$",					//小写字母
	idcard:"^[1-9]([0-9]{14}|[0-9]{17})$"	//身份证
};

var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"} 

function isCardID(sId){ 
	var iSum=0 ;
	var info="" ;
	if(!/^\d{17}(\d|x)$/i.test(sId)) return "你输入的身份证长度或格式错误"; 
	sId=sId.replace(/x$/i,"a"); 
	if(aCity[parseInt(sId.substr(0,2))]==null) return "你的身份证地区非法"; 
	sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2)); 
	var d=new Date(sBirthday.replace(/-/g,"/")) ;
	if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "身份证上的出生日期非法"; 
	for(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11) ;
	if(iSum%11!=1) return "你输入的身份证号非法"; 
	return true;//aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女") 
} 




//短时间，形如 (13:04:06)
function isTime(str)
{
	var a = str.match(/^(\d{1,2})(:)?(\d{1,2})\2(\d{1,2})$/);
	if (a == null) {return false}
	if (a[1]>24 || a[3]>60 || a[4]>60)
	{
		return false;
	}
	return true;
}

//短日期，形如 (2003-12-05)
function isDate(str)
{
	var r = str.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/); 
	if(r==null)return false; 
	var d= new Date(r[1], r[3]-1, r[4]); 
	return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
}

//长时间，形如 (2003-12-05 13:04:06)
function isDateTime(str)
{
	var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/; 
	var r = str.match(reg); 
	if(r==null) return false; 
	var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]); 
	return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
}

/**
 * 判断是否为空.
 * 
 * @param id 控件Id
 * @type boolean
 * @return 验证结果
 * @private
 */
 function checkIsEmpty(id) {

  return $("#"+id).val().length === 0;
}

/**
 * 非空验证.
 * 
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkNotEmpty (id) {
 // alert('invoke the method checkNotEmpty with args '+id);
  //var rs = $("#"+id).val().length > 0;
  //alert('the result of checkNotEmpty  '+id +" is "+rs);
  return rs = $("#"+id).val().length > 0;
}

/**
 * 验证是否为空白（空，空格）验证.
 * 
 * @param id 控件Id
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkIsBlank (id) {
  
  return regExpPattern.checkIsBlank.test($("#"+id).val());
}

/**
 * 非空白（空，空格）验证.
 * 
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkNotBlank (field) {
  //alert('checkNotBlank');
  //alert(sysMessage);
  //alert(regExpPattern);
  //alert(regExpPattern.checkIsBlank);
  
  return !regExpPattern.checkIsBlank.test($("#"+field.id).val());
}

/**
 * 添加必选栏位验证.
 *  如果默认值为“ALL”时（TEXT=请选择，VALUE=ALL），可设置checkValue == “ALL”
 * 
 * @param fields <br>
 *      对象型参数 {name: “控件名称”, title: “控件对应的栏位名称”, checkValue: “判断值”} <br>
 *          数组型参数 [{name: “控件名称”, title: “控件对应的栏位名称”, checkValue: “判断值”}]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkMustSelected (field) {
  
  var checkResult = false;
 // alert(field.name);
  var objFileds ;
  if(field.name){
  	objFileds = document.getElementsByName(field.name);
  }else{
  	objFileds = document.getElementById(field.id);
  }
  
  
  if(objFileds){
  	if(objFileds.length > 0){
  		field.id = field.id?field.id : (objFileds[0].id? objFileds[0].id : field.name);
  		//alert(field.id);
  		var fieldValue = "";
  		 //alert(objFileds[0].tagName);
  		if (objFileds[0].tagName == "INPUT") {
	    	  fieldValue =$("input[name='"+field.name+"']:checked").val();
	      }else if(objFileds[0].tagName == "SELECT") {
	    	  fieldValue =$("#"+field.id).val();
		  }
  		//alert(fieldValue);
  		if(fieldValue != null && fieldValue !="undefined" && fieldValue != field.checkValue){
	    	  checkResult = true;
	      }
  	}
  	
  	
  }

  //alert(checkResult);
  return checkResult;
}

/**
 * Number型验证.
 * <pre>
 *  “1” = true
 *  “-1” = true
 *  “0.2” = true
 *  “-0.2” = true
 * </pre>
 *
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkNumber(field) {
  
  return ($("#"+field.id).val() == "" || regExpPattern.checkNumber.test($("#"+field.id).val()));
}

/**
 * Integer型验证.
 * <pre>
 *  “1” = true
 *  “-1” = true
 *  “0.2” = false
 *  “-0.2” = false
 * </pre>
 *
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkInteger (field) {
	return regExpPattern.checkInteger.test($("#"+field.id).val());
}

/**
 * Integer型验证.
 * <pre>
 *  “1” = true
 *  “-1” = false
 *  “0.2” = false
 *  “-0.2” = false
 * </pre>
 *
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkNInteger(field) {

  return regExpPattern.checkNInteger.test($("#"+field.id).val());
}

/**
 * 添加浮点数验证.
 *  
 * <pre>
 *  “” = true
 *  “10” = false
 *  “-10” = false
 *  “10.01” = true
 *  “-10.01” = true
 *  “10e01” = false
 *  “a5” = false
 * </pre>
 * 
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkFloat(field) {
  
  return $("#"+field.id).val() == "" || regExpPattern.checkFloat.test($("#"+field.id).val());
}

/**
 * 添加正浮点数验证.
 *  
 * <pre>
 *  “” = true
 *  “10” = false
 *  “-10” = false
 *  “10.01” = true
 *  “-10.01” = false
 *  “10e01” = false
 *  “a5” = false
 * </pre>
 * 
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkNFloat(field) {
  
  return ($("#"+field.id).val() == "" || regExpPattern.checkNFloat.test($("#"+field.id).val()));
}

/**
 * 自定义数值验证.
 *
 * @param field 需要验证的对象。例如 {id: “控件的ID”, title: “控件对应的栏位名称”, isNegative: 是否可为负数(true|false), intMax: 整数最大位数, floatMax: 小数最大位数}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkCustomNumber(field) {
  
  return this.field.regExpPattern.test($("#"+field.id).val());
}

/**
 * 最大长度验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”, maxLength: 最大长度}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkMaxLength(field) {
  
  return $("#"+field.id).val().length <= field.maxLength;
}

/**
 * 最大字节数长度验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”, maxLength: 最大长度}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkMaxByteLength(field) {
  var value = $("#"+field.id).val();
  
  if (value.length > field.maxLength) {
    return false;
  }
  
  var size = 0;
  
  for (var i = 0; i < value.length; i++) {
    if (value.charCodeAt(i) > 127) {
      size+=2;
    }
    else {
      size++;
    }
  }
  
  return size <= field.maxLength;
}

/**
 * 最小长度验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”, minLength: 最小长度}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkMinLength(field) {
  
  return $("#"+field.id).val().length >= field.minLength;
}

/**
 * 区间长度验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”, minLength: 最小长度, maxLength: 最大长度}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkBetweenLength (field) {
  
  return ($("#"+field.id).val().length <= field.maxLength && $("#"+field.id).val().length >= field.minLength);
}

/**
 * 添加英文字母验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkEnglish(field) {
  
  return regExpPattern.checkEnglish.test($("#"+field.id).val());
}

/**
 * 添加英数字验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkEngAndNum(field) {
  
  return regExpPattern.checkEngAndNum.test($("#"+field.id).val());
}

/**
 * 添加英数字验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */
function checkWordChar(field) {
  
  return regExpPattern.checkWordChar.test($("#"+field.id).val());
}

/**
 * 添加自定义正则表达式验证.
 *
 * @param field 需要验证的对象。
 *    例如 {id: “控件的ID”, title: “控件对应的栏位名称”, , rule: “验证表达式”}
 *               或使用[{..}, {..}, ...]
 * @type boolean
 * @return 验证结果
 * @private
 */ 
function checkRegular(field) { 
    //alert($("#"+field.id).val().length === 0 );
 // alert( field.rule.test($("#"+field.id).val()) );
  return $("#"+field.id).val().length === 0 && field.rule.test($("#"+field.id).val());
}